package services

import "github.com/sirupsen/logrus"

//183	weekSwitch	//	星期开关     1字节8个位，1~7位分别代表星期一到星期日
//184	cycleStartTime1	//	循环开启时间1   小时（1字节）
//185		//	循环开启时间1   分钟（1字节）
//186	cycleEndTime1	//	循环关闭时间1   小时（1字节）
//187		//	循环关闭时间1   分钟（1字节）
//188	duration1	//	开启时长1    小时（1字节）
//189		//	开启时长1    分钟（1字节）
//190		//	开启时长1    秒（1字节）
//191	interval1	//	间隔时长1    小时（1字节）
//192		//	间隔时长1    分钟（1字节）
//193		//	间隔时长1    秒（1字节）
//194	mistMode1	//	雾化模式1    0 正常  1动感模式  2 跟随外界
//195	mistSpeed1	//	雾化速度1   0~100%
//196	scheduledStartTime1	//	定时开启时间1   小时（1字节）
//197		//	定时开启时间1   分钟（1字节）
//198	scheduledDuration1	//	定时开启时长1    分钟（1字节）
//199		//	定时开启时长1    秒（1字节）
//200	scheduledStartTime2	//	定时开启时间2   小时（1字节）
//201		//	定时开启时间2  分钟（1字节）
//202	scheduledDuration2	//	定时开启时长2    分钟（1字节）
//203		//	定时开启时长2    秒（1字节）
//204	weekSwitch1	//	星期开关     1字节8个位，1~7位分别代表星期一到星期日
//205	mistCycleRefillTime	//	雾化循环补水时间 分钟
//206	humidityLowerLimit	//	湿度模式下限
//207	humidityUpperLimit	//	湿度模式上限
//208	autoModeSwitch	//	自动模式开关
//209	mistControlRegister	//	雾化控制寄存器
//210	coolingMode	//	降温模式
//211	postSprayVentDuration	//	喷淋停止后通风   分钟
// Define the mapping of parameters with their respective memory address and length
var MistCtrlTParamsMap = map[string]DataRule{
	"weekSwitch":            {StartAddr: 183, Length: 1},
	"cycleStartTime1":       {StartAddr: 184, Length: 2}, // Hour and Minute
	"cycleEndTime1":         {StartAddr: 186, Length: 2}, // Hour and Minute
	"duration1":             {StartAddr: 188, Length: 3}, // Hour, Minute, and Second
	"interval1":             {StartAddr: 191, Length: 3}, // Hour, Minute, and Second
	"mistMode1":             {StartAddr: 194, Length: 1},
	"mistSpeed1":            {StartAddr: 195, Length: 1},
	"scheduledStartTime1":   {StartAddr: 196, Length: 2}, // Hour and Minute
	"scheduledDuration1":    {StartAddr: 198, Length: 2}, // Minute and Second
	"scheduledStartTime2":   {StartAddr: 200, Length: 2}, // Hour and Minute
	"scheduledDuration2":    {StartAddr: 202, Length: 2}, // Minute and Second
	"weekSwitch1":           {StartAddr: 204, Length: 1},
	"mistCycleRefillTime":   {StartAddr: 205, Length: 1},
	"humidityLowerLimit":    {StartAddr: 206, Length: 1},
	"humidityUpperLimit":    {StartAddr: 207, Length: 1},
	"autoModeSwitch":        {StartAddr: 208, Length: 1},
	"mistControlRegister":   {StartAddr: 209, Length: 1},
	"coolingMode":           {StartAddr: 210, Length: 1},
	"postSprayVentDuration": {StartAddr: 211, Length: 1},
}

// Define a structure to hold the mist control parameters
type MistCtrlTParams struct {
	WeekSwitch            uint8  `json:"weekSwitch"`
	CycleStartTime1       string `json:"cycleStartTime1"`
	CycleEndTime1         string `json:"cycleEndTime1"`
	Duration1             string `json:"duration1"`
	Interval1             string `json:"interval1"`
	MistMode1             uint8  `json:"mistMode1"`
	MistSpeed1            uint8  `json:"mistSpeed1"`
	ScheduledStartTime1   string `json:"scheduledStartTime1"`
	ScheduledDuration1    string `json:"scheduledDuration1"`
	ScheduledStartTime2   string `json:"scheduledStartTime2"`
	ScheduledDuration2    string `json:"scheduledDuration2"`
	MistCycleRefillTime   uint8  `json:"mistCycleRefillTime"`
	HumidityLowerLimit    uint8  `json:"humidityLowerLimit"`
	HumidityUpperLimit    uint8  `json:"humidityUpperLimit"`
	AutoModeSwitch        uint8  `json:"autoModeSwitch"`
	MistControlRegister   uint8  `json:"mistControlRegister"`
	CoolingMode           uint8  `json:"coolingMode"`
	PostSprayVentDuration uint8  `json:"postSprayVentDuration"`
}

// Function to assemble and send the payload for mist controller settings
func AssembleMistCtrlTPayload(mac string, method string, params map[string]interface{}) error {
	var byteList []ByteData
	// Sort params by startAddr
	for k, v := range params {
		logrus.Infof("Key: %s, Value: %v", k, v)
		if dataRule, ok := MistCtrlTParamsMap[k]; ok {
			byteList = append(byteList, ByteData{
				StartAddr: dataRule.StartAddr,
				Length:    dataRule.Length,
				Value:     v,
			})
		}
	}
	logrus.Info("Unsorted byteList:", byteList)
	err := AssembleCommandPayloadByByteData(mac, method, byteList)
	return err
}
